"""
日志配置模块
"""

import logging
import logging.handlers
import os
from datetime import datetime
from typing import Dict, Any, Optional


def setup_logger(name: str = 'wechat_robot', 
                config: Optional[Dict[str, Any]] = None) -> logging.Logger:
    """
    设置日志记录器
    
    Args:
        name: 日志器名称
        config: 日志配置字典，包含以下键：
            - level: 日志级别 (默认: INFO)
            - file_path: 日志文件路径 (默认: None，不写入文件)
            - max_file_size: 最大文件大小 (默认: 10MB)
            - backup_count: 备份文件数量 (默认: 5)
            - format: 日志格式 (默认: 标准格式)
            - date_format: 日期格式 (默认: %Y-%m-%d %H:%M:%S)
        
    Returns:
        配置好的日志记录器
    """
    # 使用默认配置
    if config is None:
        config = {}
    
    # 获取配置值
    level = config.get('level', 'INFO')
    log_file = config.get('file_path')
    max_file_size = config.get('max_file_size', '10MB')
    backup_count = config.get('backup_count', 5)
    log_format = config.get('format', '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    date_format = config.get('date_format', '%Y-%m-%d %H:%M:%S')
    
    logger = logging.getLogger(name)
    logger.setLevel(getattr(logging, level.upper()))
    
    # 避免重复添加处理器
    if logger.handlers:
        return logger
    
    # 创建格式化器
    formatter = logging.Formatter(log_format, datefmt=date_format)
    
    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(getattr(logging, level.upper()))
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    # 文件处理器
    if log_file:
        # 确保日志目录存在
        log_dir = os.path.dirname(log_file)
        if log_dir:
            os.makedirs(log_dir, exist_ok=True)
        
        # 解析文件大小
        max_bytes = _parse_file_size(max_file_size)
        
        # 使用RotatingFileHandler实现日志轮转
        file_handler = logging.handlers.RotatingFileHandler(
            log_file, 
            maxBytes=max_bytes, 
            backupCount=backup_count,
            encoding='utf-8'
        )
        file_handler.setLevel(getattr(logging, level.upper()))
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    return logger


def _parse_file_size(size_str: str) -> int:
    """
    解析文件大小字符串
    
    Args:
        size_str: 文件大小字符串，如 "10MB", "1GB", "500KB"
        
    Returns:
        字节数
    """
    size_str = size_str.upper().strip()
    
    # 单位映射
    units = {
        'B': 1,
        'KB': 1024,
        'MB': 1024 * 1024,
        'GB': 1024 * 1024 * 1024,
        'TB': 1024 * 1024 * 1024 * 1024
    }
    
    # 提取数字和单位
    for unit, multiplier in units.items():
        if size_str.endswith(unit):
            try:
                number = float(size_str[:-len(unit)])
                return int(number * multiplier)
            except ValueError:
                break
    
    # 如果没有单位，默认为字节
    try:
        return int(float(size_str))
    except ValueError:
        # 如果解析失败，返回默认值10MB
        return 10 * 1024 * 1024
